package test3.file;

//import org.junit.Test;
import test3.bean.Admini;
import test3.bean.Employee;
import test3.runexception.NotThisFileException;

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class FileModel {

	private static final String FILE_NAME="C:\\file\\Employee.txt";	//员工文件路径

	private static final String DELETE_EMPLOYEE_FILENAME="C:\\file\\Employee-deleted.txt";	//被删员工备份路径

	private static final String ADMINISTRATORS_FILE="C:\\file\\administrators.txt";	//管理员信息路径
	/**
	 * 将内存中的数据全部写入文件中
	 * @param map
	 */
	public void outputAllEmployee(Map<Integer, Employee> map) throws IOException {

		File file=new File(FILE_NAME);

		if (!file.exists()){
			System.out.println("无该文件");
			file.createNewFile();
		}

		OutputStream os=new FileOutputStream(file);
		ObjectOutputStream oos=new ObjectOutputStream(os);

		if (oos==null){
			System.out.println("无法创建该文件");
			return ;
		}

		try {

			Iterator<Employee>it=map.values().iterator();
			while (it.hasNext()){
				Employee ee=it.next();
				oos.writeObject(ee);
			}

			oos.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}finally {
			try {
				if(oos!=null) {
					oos.close();
				}
				if (os!=null){
					os.close();
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
	}

	/**
	 * 将所有本地的员工信息全部读入内存
	 * @return 包含所有员工信息的关系集合
	 */
	public Map<Integer,Employee> inputAllEmployee() {
		//文件输入流
		InputStream is=null;
		//对象输入流
		ObjectInputStream iss=null;
		//保存读取的所有员工信息的集合
		Map<Integer,Employee>map=null;
		try {

			File file=new File(FILE_NAME);
			if (!file.exists())
				file.createNewFile();
			//打开绑定本地文件的流
			is=new FileInputStream(file);
			//打开失败
			if(is==null)
				return null;
			map=new HashMap<>();
			//将文件流包装成对象流操作
			iss=new ObjectInputStream(is);
			//员工信息
			Employee e=null;
			//读取所有的员工的信息，将其放入集合中

		    do {
		    	e= (Employee) iss.readObject();
		    	map.put(e.getId(),e);
			}while (e!=null);


		}catch (EOFException e){
			System.out.println("员工文件已读取完毕");
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			try {
				//在操作结束后，关闭所有的流
				if(is!=null) {
					is.close();
				}
				if(iss!=null) {
					iss.close();
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return map;
	}

	/**
	 * 在删除一个员工数据的时候，将其放入备用的文件中
	 * @param e
	 * @param fo
	 */
	public void afterDeleteOrUpdate(Employee e,FileOpreation fo){
		OutputStream os=null;
		OutputStreamWriter osw=null;

		try {
			String fileName=getThisTimeStr();

			System.out.println(fileName);

			File file=new File(fileName);

			if (!file.exists()){

				System.out.println("文件不存在");
				file.createNewFile();
				os=new FileOutputStream(file);
				osw=new OutputStreamWriter(os);
				String topTital="id \t name \t sex \t age \t delete_date \t opreation \r\n";
				osw.write(topTital);

				osw.close();
				os.close();
			}

			os=new FileOutputStream(getThisTimeStr(),true);

			osw=new OutputStreamWriter(os);

			Date date=new Date();
			DateFormat dateFormat=new SimpleDateFormat("hh:mm:ss");
			String dateStr=dateFormat.format(date);

			String addText=""+e.getId()+ " \t"+e.getName()+"  \t "+
					e.getSex()+" \t "+e.getAge()+" \t "+dateStr;
			if (fo.equals(FileOpreation.DELETE))
				addText+=" \t delete \r\n";
			else if (fo.equals(FileOpreation.UPDATE))
				addText+=" \t update \r\n";
			System.out.println(addText);

			osw.write(addText);

		} catch (Exception ee){
			ee.printStackTrace();
		}finally {
			try {
				if (osw!=null){
					osw.close();
				}
				if (os!=null){
					os.close();
				}
			}catch (Exception ee){
				ee.printStackTrace();
			}
		}
	}

	/**
	 * 将所有的用户的信息添加到本地文件中
	 * @param adminis
	 * @throws IOException
	 */
	public void saveAdministrators(HashMap<String,String> adminis) {

		ObjectOutputStream oos=null;

		try {
			oos=getObjectOutputStreamByFileName(ADMINISTRATORS_FILE);

			oos.writeObject(adminis);

			oos.flush();

		}catch (Exception e){
			e.printStackTrace();
		}finally {
			if (oos!=null){
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public HashMap<String,String> getAdministrators(){

		File file=new File(ADMINISTRATORS_FILE);

		ObjectInputStream ois=null;

		HashMap<String,String> adminis=new HashMap<>();

		try {

			if (!file.exists())
				file.createNewFile();

			ois = new ObjectInputStream(new FileInputStream(file));

			adminis= (HashMap<String, String>) ois.readObject();

		}catch (EOFException e){
			System.out.println("管理员文件加载完毕！");
		}
		catch (Exception e){
			e.printStackTrace();
		}finally {
			if (ois!=null){
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		return adminis;
	}

	/**
	 * 得到一个当前的日期
	 * @return
	 */
	private String getThisTimeStr(){
		String dateStr=null;

		Date date=new Date();

		DateFormat dateFormat=new SimpleDateFormat("yyyy_MM_dd");

		dateStr=dateFormat.format(date);

		String []dateFileNames=DELETE_EMPLOYEE_FILENAME.split("\\.");

		String dateFileName=dateFileNames[0];

		dateStr=dateFileName+"_"+dateStr+".txt";

		return dateStr;
	}

	/**
	 * 根据文件名得到一个文件对象输出流
	 * @param fileName 指定文件名
	 * @return 返回文件对象输出流
	 * @throws IOException
	 */
	private ObjectOutputStream getObjectOutputStreamByFileName(String fileName) throws IOException {
		File file=new File(fileName);
		if (!file.exists()){
			System.out.println("无该文件");
			file.createNewFile();
		}
		OutputStream os=new FileOutputStream(file);
		ObjectOutputStream oos=new ObjectOutputStream(os);
		if (oos==null){
			System.out.println("无法创建该文件");
			return null;
		}
		return oos;
	}
}
